package com.cskaoyan.javase.oop3._3inner._3loacl._3notice;

/**
 * 局部内部类使用时的注意事项
 * 当你在局部内部类的成员方法中，访问方法的局部变量时，假如你想修改，会报错：
 * Variable 'a' is accessed from within inner class, needs to be final or effectively final
 * 如果你想要在局部内部类当中，访问方法的局部变量，那么这个局部变量要么直接声明为final。要么实际上就是一个final
 *
 * 为什么呢？为什么一定要是一个常量呢？
 * 之所以这么设计，主要原因还是`局部变量的生命周期`和`局部内部类对象的生命周期`是由冲突的。方法执行完毕后，局部变量就会被销毁，而局部内部类对象不是，对象甚至可能都不是`垃圾`，而是会继续使用。那么这时，对象如果还想去访问方法的局部变量，又去哪里找呢？
 *
 * 为了解决这种生命周期的问题，在创建局部内部类对象时，如果在局部内部类的方法中访问了方法的局部变量，那这个局部变量就会作为该内部类对象的一个成员变量。
 *
 * 如果在局部内部类的方法中，修改了局部变量的值，那么在该方法中再次访问它的值？又咋办呢？参考下列代码
 * 总之，Java的设计者没有采取同步的方案，而是直接堵死了修改
 * 直接禁止了`能在局部内部类内部，访问的局部变量`的修改，只要不修改，是一个局部常量，那自然不需要考虑同步问题。
 *
 * 在`Java8`之前版本的JDK中，如果不给`能在局部内部类内部，访问的局部变量`直接加上final修饰，会编译报错。但是在Java8之后该final修饰符被隐藏在了底层，程序员可以不用给该局部变量显式加final。这也是一种`语法糖`。
 *
 * @since 14:20
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
}

class EnclosedClazz {
    public void test() {
        int a = 10;
        // 成员方法中的局部内部类
        class Inner {
            public void method() {
                System.out.println(a);
                // Variable 'a' is accessed from within inner class, needs to be final or effectively final
                // a = 100;
            }
        }
    }
}